import '../models/upload_stats.dart';
import '../models/ai_pick_settings.dart';
import '../models/connection_method.dart';
import '../models/tutorial_page.dart';
import '../models/photo_item.dart';

/// Mock 数据类
///
/// 提供所有界面使用的模拟数据
class MockData {
  MockData._(); // 防止实例化

  /// base64 缩略图占位图（16x16 彩色 PNG）
  static const List<String> _thumbnailPlaceholders = [
    '',
    '',
    '',
    '',
    '',
    '',
  ];

  // ============= 上传统计信息 =============

  /// Mock 上传统计数据（匹配photoItems的实际数量）
  static const UploadStats uploadStats = UploadStats(
    allCount: 48, // 总共48张照片
    pendingCount: 10, // 待挑：index 0-9
    uploadingCount: 2, // 上传中：index 10-11
    uploadedCount: 36, // 已上传：index 12-47
    failedCount: 0, // 失败：无
  );

  // ============= AI挑图设置 =============

  /// Mock AI挑图设置数据
  static const AIPickSettings aiPickSettings = AIPickSettings(
    uploadRule: UploadRule.aiFiltered,
    duplicateDetectionEnabled: true,
    eyesClosedDetectionEnabled: true,
    overexposureDetectionEnabled: true,
    underexposureDetectionEnabled: true,
    clarityDetectionEnabled: true,
  );

  // ============= 连接方式 =============

  /// Mock 连接方式列表
  static const List<ConnectionMethod> connectionMethods = [
    ConnectionMethod(
      type: ConnectionType.usb,
      displayName: 'USB连接',
      description: '通过USB数据线连接相机，传输速度快且稳定',
      iconName: 'usb',
    ),
    ConnectionMethod(
      type: ConnectionType.wifi,
      displayName: 'WiFi连接',
      description: '通过WiFi无线连接相机，无需数据线',
      iconName: 'wifi',
    ),
  ];

  // ============= 教程页面 =============

  /// Mock 教程页面列表
  static const List<TutorialPage> tutorialPages = [
    TutorialPage(
      title: '欢迎使用相机连接传输',
      description: '通过USB或WiFi连接您的相机，快速传输和管理照片。支持AI智能筛选，自动识别高质量照片。',
      pageIndex: 0,
    ),
    TutorialPage(
      title: '选择连接方式',
      description: 'USB连接：速度快，稳定可靠\nWiFi连接：无线便捷，自由移动',
      pageIndex: 1,
    ),
    TutorialPage(
      title: 'AI智能挑选',
      description: '开启AI挑图功能，自动过滤模糊、闭眼、过曝等问题照片，只保留最佳作品。',
      pageIndex: 2,
    ),
    TutorialPage(
      title: '开始使用',
      description: '现在就连接您的相机，体验智能照片管理的便捷。点击"开始使用"进入首页。',
      pageIndex: 3,
    ),
  ];

  // ============= 图片列表 =============

  /// Mock 图片列表数据（随机分布在一个月内的多个日期和时间，通过算法动态分组）
  static final List<PhotoItem> photoItems = () {
    final now = DateTime.now();
    final photos = <PhotoItem>[];

    // 生成48张照片，分布在最近一个月（30天）内，时间随机
    for (int i = 0; i < 48; i++) {
      // 模拟不同的上传状态分布
      int status;
      if (i < 10) {
        status = 0; // 未上传/待挑
      } else if (i < 12) {
        status = 1; // 上传中
      } else {
        status = 2; // 已上传
      }

      // 生成随机时间：最近30天内的随机时间点
      // 使用索引来生成伪随机但一致的时间分布
      final daysAgo = (i * 3) % 30; // 0-29天前（一个月）
      final hoursOffset = (i * 5 + i ~/ 3) % 18 + 8; // 8-25小时（模拟工作时间）
      final minutesOffset = (i * 17) % 60; // 0-59分钟

      final captureTime = now.subtract(
        Duration(
          days: daysAgo,
          hours: hoursOffset,
          minutes: minutesOffset,
        ),
      );

      photos.add(PhotoItem(
        id: 'photo_${i + 1}',
        thumbnailPath:
            _thumbnailPlaceholders[i % _thumbnailPlaceholders.length],
        originalPath: '/camera/photos/IMG_${1000 + i}.jpg',
        fileName: 'IMG_${1000 + i}.jpg',
        captureTime: captureTime,
        fileSize: 2500000 + (i * 50000), // 2.5MB ~ 5MB
        isSelected: false,
        uploadStatus: status,
      ));
    }

    // 按时间倒序排序（最新的在前面）
    photos.sort((a, b) => b.captureTime.compareTo(a.captureTime));

    return photos;
  }();

  // ============= 辅助方法 =============

  /// 获取指定状态的图片列表
  static List<PhotoItem> getPhotosByStatus(int status) {
    return photoItems.where((photo) => photo.uploadStatus == status).toList();
  }

  /// 获取已选中的图片列表
  static List<PhotoItem> getSelectedPhotos() {
    return photoItems.where((photo) => photo.isSelected).toList();
  }

  /// 计算选中图片的总大小
  static int getSelectedPhotosSize() {
    return getSelectedPhotos().fold<int>(
      0,
      (total, photo) => total + photo.fileSize,
    );
  }

  /// 格式化文件大小
  static String formatFileSize(int bytes) {
    if (bytes < 1024) {
      return '$bytes B';
    } else if (bytes < 1024 * 1024) {
      return '${(bytes / 1024).toStringAsFixed(1)} KB';
    } else if (bytes < 1024 * 1024 * 1024) {
      return '${(bytes / (1024 * 1024)).toStringAsFixed(1)} MB';
    } else {
      return '${(bytes / (1024 * 1024 * 1024)).toStringAsFixed(2)} GB';
    }
  }
}
